﻿///////////////////////////////////////////////////////////////////////////////
/// Copyright (c) by longshuang@msn.cn 2014.
/// All rights reserved.
/// 
/// @File	: Engine.Model.hpp
/// @Brief	: 常用类模型（模板类）定义
/// @Author	: Leo Zhao <longshuang@msn.cn>
/// @Date	: 2014-12-03
///
/// CHANGELOG
///		2015-03-18	Guard移至Utils中
///		2015-01-22	Singleton增加手动回收
///		2014-12-04	增加局部作用域工具类Guard
/// 	2014-12-03	DisableCopy和Singleton入库
///////////////////////////////////////////////////////////////////////////////
#ifndef		__ENGINE_MODEL_HPP_INCLUDE__
#define		__ENGINE_MODEL_HPP_INCLUDE__	

#include	<map>
#include	<memory>

namespace Engine {

	/// @Brief	: 用于标志继承自该类的子类对象不可被复制
	class IDisableCopy {
	public:
		IDisableCopy() {}
		virtual ~IDisableCopy() {}

	private:
		IDisableCopy(const IDisableCopy &) = delete;
		IDisableCopy & operator=(const IDisableCopy &) = delete;
	};

	/// @Brief	: 获得一个类运行期的单例对象
	/// @Note	: 对于全局单例存在的static变量，除POD类型外，请使用该类而非直接static定义。
	template<class T>
	class ISingleton : public IDisableCopy {
	public:
		/// @Brief	: 获得指定类型的单例引用
		/// @Param	: NONE
		/// @Return	: 返回该类的单例引用，如未创建则先创建后返回，程序结束后自动回收该单例
		static inline T &	Instance() {
			if (_spData.get() == nullptr) {
				_spData.reset(new T());
			}
			return (* _spData.get());
		}

		/// @Brief	: 手动回收一个单例
		/// @Param	: NONE
		/// @Return	: NONE
		static inline void	Destroy() {
			_spData.reset(nullptr);
		}

	private:
		static std::unique_ptr<T>	_spData;
	};
	template<class T> std::unique_ptr<T> ISingleton<T>::_spData(nullptr);
	
}

#endif//!	__ENGINE_MODEL_HPP_INCLUDE__
